Aller au contenu principal

M'en fou pas lu

  • Tu clones ca
  • Tu suis les instructions d'installation
  • Tu profites

Pourquoi utiliser devenv

Devenv permet de faciliter la mise en place d'environnement de développement. Il utilise le package manager de nix pour faire en sorte que chaque environnement de développement soit isolé tout en restant performant car tout tourne sur la machine hôte.

Et pourquoi pas docker compose ?

  • Pas de possibilité de comprendre en un seul fichier toutes les dépendances de l'environnement de développement
  • Pas de possibilité de garder ses préférences de terminal (.bashrc), d'utiliser ses outils préférés en cli si besoin (vim, tmux, etc)
  • Il faut gérer les volumes pour savoir ce à quoi on veut avoir accés pendant le développement
  • Probléme de lenteur avec next.js
  • Probléme d'usage de RAM avec mac (Besoin d'une machne virtuelle faisant tourner des container)
  • Compliqué de faire tourner les linter dans les hook git étant donné que le runtime est dans le container alors que la commande git est lancée sur la machine hôte

Installation

Nix package manager

La première chose à faire est d'installer le package manager nix. Le mieux est d'utiliser le determinate installer.

curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install

Il faut voir cet outil comme une sorte d'apt compatible avec tous les systèmes d'exploitation Linux et MacOS.

Installation de devenv

nix profile install --accept-flake-config nixpkgs#devenv
remarque

le flag --accept-flake-config est lié au fait que la notion de flakes dans nix n'est pas encore considérée comme stable, même si la communauté nix l'utilise déjà en majorité.

Vérification de l'installation

en lançant la commande suivante, vous devriez voir la version de devenv

devenv version

Configuration

Initialisation

Si vous voulez juste un env de dev ITN "classique"

https://github.com/ITNetworkParis/skeleton

Si vous souhaitez configurer un environnement de zero

cd <votre-nouveau-super-projet>
devenv init

Fichiers de configuration

Vous aves 4 fichiers de configuration créé

  • .envrc => fichier de configuration de direnv (j'en parle plus bas)
  • devenv.nix => c'est dans ce fichier que vous allez décrire votre environnement de développement
  • devenv.yaml => c'est les valeurs d'entrée de votre environnement de développement, normalement vous n'avez pas besoin de le modifier
  • devenv.lock => c'est le fichier qui s'assure sue tout le monde utilise la même version des dépendances (équivaut à un yarn.lock ou un composer.lock)

devenv.nix

le guide décrit assez bien comment configurer les différents éléments. Concrétement vous allez avoir besoin de trois éléments principaux

Languages

Ce sont les différents runtime à installer. Par exemple, si vous avez besoin de nodejs 20, vous allez devoir ajouter la ligne suivante dans votre devenv.nix

languages = {
javascript = {
enable = true;
package = pkgs.nodejs_20;
};
};

Services

Ce sont les services que vous allez devoir lancer pour que votre environnement de développement fonctionne. Par exemple, si vous avez besoin de postgresql 16, vous allez devoir ajouter la ligne suivante dans votre devenv.nix

services = {
postgresql = {
enable = true;
package = pkgs.postgresql_16;
};
};

Processes

Ce sont les processus que vous allez devoir lancer pour que votre environnement de développement fonctionne. Par exemple, si vous avez besoin de lancer votre démon next.js, vous allez devoir ajouter la ligne suivante dans votre devenv.nix

  processes = {
nextjs.exec = "cd front && npm run dev";
};
info

Il est possible de définir des dépendances avec des services, par exemple si vous avez besoin de lancer un worker qui dépend de postgresql et rabbitmq, vous pouvez ajouter la ligne suivante dans votre devenv.nix

  processes = {
my-worker = {
exec = "bin/console swarrot:consume:my-worker";
depends_on.rabbitmq.condition = "process_healthy";
depends_on.postgres.condition = "process_healthy";
};
};

Les autres config intéresantes mais moins importantes

Hooks git

scripts

Utilisation

Activation de l'environnement de développement

Normalement pas nécessaire si direnv est installé

devenv shell

Lancement des services et des processus (utilise compose)

devenv up
info

petits tips intéressants sur process-compose

direnv (optionnel)

Si vous voulez que votre environnement de développement soit activé automatiquement à chaque fois que vous entrez dans le dossier de votre projet, vous pouvez utiliser direnv.

nix profile install --accept-flake-config nixpkgs#direnv 

ajouter à la fin de votre fichier .bashrc

eval "$(direnv hook bash)"
attention

il faudra penser à relancer votre terminal pour que les changements soient pris en compte

info

il faut utiliser la commande direnv allow pour autoriser l'exécution du fichier .envrc la première fois que vous entrez dans le dossier de votre projet (c'est une sécurité de direnv)

Astuces

Surcharger le fichier de configuration

Vous pouvez surcharger la configuration avec un fichier de configuration spécifique(sur le même principe que le docker-compose.override.yml de docker) en créant un fichier devenv.local.nix

Désactiver un service

Par exemple pour les personnes souhaitant garder la base de donnée installée via APT

services.postgres.enable = lib.mkForce false;

Désactiver un processus

Si on ne veut pas lancer certains worker rabbitmq

processes.mailer_processor.process-compose.disabled = true;

mailer_processor est le nom du process défini dans devenv.nix

Chercher un paquet

Avec devenv

La recherche devenv permet à la fois de chercher dans les options de devenv mais aussi dans les paquets nix disponibles

devenv search php

https://search.nixos.org/packages

Pour installer un paquet une fois que l'on connait son nom, se référer à la section suivante de la documentation

Installer un paquet a une version spécifique

Nixhub est un moteur de recherche alternatif pour les paquets nix. Il a l'avantage de donner la possibilité de connaitre toutes les versions disponibles d'un paquet. C'est un outil fourni par jetify, créateur d'une alternative à devenv nommé devbox.

Par exemple si vous voulez installer bat (une alternative en rust à cat à la version 0.20), vous pouvez aller sur la page nixhub de bat pour voir toutes les versions disponibles. Pour installer la versions que l'on veut, il faut récupérer le hash du commit Nixpkgs (nixpkgs/4d38122a19cc3c415baf04b99906c8caa828a5fc dans notre cas) et ajouter la ligne suivante dans votre devenv.yaml

inputs:
# We want update on process-compose for new features (clean and mark logs)
nix-bat_0_22_0:
url: github:NixOS/nixpkgs?rev=4d38122a19cc3c415baf04b99906c8caa828a5fc

puis dans le fichier devenv.nix

{ pkgs, lib, config, inputs, ... }:

let
nix-bat_0_22_0 = import nix-bat_0_22_0 { inherit (pkgs) system; };
in
{


packages = [
nix-bat_0_22_0.bat
]

# ...

}

Voir les exemples de configuration

Beaucoup d'exemples de configuration sont disponibles sur le github de devenv

Mettre à jour devenv

nix profile upgrade --accept-flake-config devenv